/*代码的作用是演示父进程如何等待子进程的退出状态。

主要步骤包括：

使用fork()函数创建一个子进程，如果失败则打印错误信息并退出。
在子进程中，打印子进程的进程ID（PID），然后睡眠5秒，模拟子进程执行一些任务。
在父进程中，打印父进程的提示信息。
使用waitpid()函数等待子进程的退出状态，通过设置WNOHANG选项，父进程不会阻塞等待子进程退出，而是立即返回。
父进程进入一个循环，每隔1秒钟检查子进程是否已经退出。
如果waitpid()返回0，表示子进程尚未退出，父进程打印"No child exit."的提示信息，并睡眠1秒钟。
当子进程退出时，waitpid()会返回子进程的PID。父进程打印子进程的退出状态，并使用WEXITSTATUS()宏来获取子进程的退出状态码。
父进程结束后，整个程序结束。

通过使用waitpid()函数，父进程可以等待子进程的退出，并获取子进程的退出状态。这样可以实现父子进程之间的协调和同步。*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main(){
    pid_t pid,pw;
    int status;

    if ((pid=fork())<0){
        perror("fork");
        exit(-1);
    }else if (pid==0){
        // 子进程执行的代码
        printf("In child process: %d\n",getpid());
        sleep(5);
        exit(1);
    }else{
        // 父进程执行的代码
        printf("In parent process:\n");
        
        // 等待子进程退出并获取退出状态
        do{
            pw=waitpid(pid,&status,WNOHANG);
            if (pw==0){
                printf("No child exit.\n");
                sleep(1);
            }
        }while(pw==0);

        printf("Child %d exit, exit status:%d.\n",pw,WEXITSTATUS(status));
    }

    return 0;
}
